package leetcode.backtrace;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/*

给定一个可包含重复数字的序列 nums ，按任意顺序 返回所有不重复的全排列。

 

示例 1：

输入：nums = [1,1,2]
输出：
[[1,1,2],
 [1,2,1],
 [2,1,1]]
示例 2：

输入：nums = [1,2,3]
输出：[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
 

提示：

1 <= nums.length <= 8
-10 <= nums[i] <= 10

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/permutations-ii
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

解法：
    1. 在dfs时，同层相同元素跳过排列组合

 */

public class LeetCode47_Solution {

    public List<List<Integer>> permuteUnique(int[] nums) {

        List<List<Integer>> result = new ArrayList<>();
        solution(result, nums, new ArrayList<>(), new HashSet<>(), -1);

        return result;
    }

    public void solution(List<List<Integer>> result, int[] nums, List<Integer> currentPath,
                         Set<Integer> usedIndex, int currentIndex){

        if (currentPath.size() == nums.length){
            List<Integer> r = new ArrayList<>(currentPath);
            result.add(r);
            usedIndex.remove(currentIndex);
            currentPath.remove(currentPath.size() - 1);
            return;
        }
        // 同层有相同元素不再排列
        Set<Integer> sameElement = new HashSet<>();
        for(int i = 0; i < nums.length; i++){
            if (sameElement.contains(nums[i]) || usedIndex.contains(i)){
                continue;
            }
            sameElement.add(nums[i]);
            currentPath.add(nums[i]);
            usedIndex.add(i);
            solution(result, nums, currentPath, usedIndex, i);
        }

        if (currentIndex >= 0){
            usedIndex.remove(currentIndex);
            currentPath.remove(currentPath.size() - 1);
        }

    }

    public static void main(String[] args) {

        // int[] nums = new int[]{1, 2, 3};
        int[] nums = new int[]{1, 1, 3};
        List<List<Integer>> lists = new LeetCode47_Solution().permuteUnique(nums);
        System.out.println("lists = " + lists);


    }

}
